package com.zdp.leetcodeMiddle;


import java.util.*;

/*
* 题目描述：
* 给定一个可包含重复数字的序列 nums ，按任意顺序 返回所有不重复的全排列。
示例 1：
输入：nums = [1,1,2]
输出：
[[1,1,2],
 [1,2,1],
 [2,1,1]]
示例 2：
输入：nums = [1,2,3]
输出：[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
提示：
1 <= nums.length <= 8
-10 <= nums[i] <= 10
来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/permutations-ii
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
* */
public class 全排列2_47 {

    public static void main(String[] args) {
        全排列2_47 demo = new 全排列2_47();
        int[] nums = new int[]{
                2,2,1,1
        };
        List<List<Integer>> lists = demo.permuteUnique(nums);
        for(List<Integer> temp : lists){
            System.out.println(temp.toString());
        }
    }
    /*
    * 全排列 ： 搜索+回溯
    * 去重  每个位置上 各种数值只能出现一次，那么就记录一下 上次出现的数值即可
    * 然后进行比较
    * */
    private List<List<Integer>> result = new ArrayList<>();
    public List<List<Integer>> permuteUnique(int[] nums) {
        Arrays.sort(nums);
        boolean[] vis = new boolean[nums.length];
        f(nums,new ArrayList<Integer>(),vis);
        return result;
    }

    public void f(int[] nums, List<Integer> temp, boolean[] vis){
        if(temp.size() == nums.length){
            result.add(new ArrayList<>(temp));
            return ;
        }
        int t = -15;
        for(int i=0;i<nums.length;i++){
            if(vis[i]){
                continue;
            }
            if(nums[i] == t){
                continue;
            }
            vis[i] = true;
            temp.add(nums[i]);
            f(nums,temp,vis);
            // 回溯 j++;
            t = nums[i];
            temp.remove(temp.size()-1);
            vis[i] = false;
        }
    }
}
